package cn.catsdad.base.repository;

import cn.catsdad.base.entity.BaseEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.support.JpaEntityInformation;
import org.springframework.data.repository.NoRepositoryBean;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

/**
 * 最上层repository，提供基本持久化操作
 * 如果使用批量保存需开启对应的数据库批量操作配置和对应orm实现的批量操作配置
 * 比如jpa使用默认hibernate实现，数据库使用mysql则需要开启hibernate与mysql的批量操作相关配置，否则无法发挥批量操作的全部性能。
 *
 * @author xuyl
 * @version V1.0.0 2024/7/5
 * @since V100R001
 */
@NoRepositoryBean
public interface IBaseRepository<T extends BaseEntity, ID extends Serializable> extends JpaRepository<T, ID> {

    /**
     * 批量保存，可根据实体状态自动判断update还是insert
     *
     * @param entities 保存的实体集合
     */
    void batchSave(Collection<T> entities);

    /**
     * 批量insert，只可以进行insert操作
     *
     * @param entities 实体集合
     */
    void batchInsert(Collection<T> entities);

    /**
     * 批量update，只可以进行update操作
     *
     * @param entities 实体集合
     */
    void batchUpdate(Collection<T> entities);

    /**
     * 查询非逻辑删除数据
     *
     * @param id 数据id
     * @return 实体
     */
    T findByIdAndIsDeletedFalse(ID id);

    /**
     * 查询非逻辑删除数据
     *
     * @param ids 数据id
     * @return 实体集合
     */
    List<T> findByIdInAndIsDeletedFalse(Iterable<ID> ids);

    /**
     * 获取实体类型
     *
     * @return 实体类型
     */
    Class<T> getEntityClass();

    String getQueryAlias();

    /**
     * 获取jpa实体信息封装对象
     *
     * @return 实体信息封装对象
     */
    JpaEntityInformation<T, ID> getEntityInfo();

}
